// Copyright © yanghy. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and limitations under the License.

package codegen

// autoCodeTemplate 自动代码模板
const autoCodeTemplate = `// ==============================================================================
// 🔥 Code automatically generated by ENERGY GUI Designer. DO NOT EDIT
// 🔥 ENERGY GUI 设计器自动生成代码. 不能编辑
// ==============================================================================
// 🔍 基本信息
//     生成工具: ENERGY GUI Designer {{.BaseInfo.DesignerVersion}}
//     生成时间: {{.BaseInfo.DateTime}}
//     设计文件: {{.BaseInfo.UIFile}}
//     用户文件: {{.BaseInfo.UserFile}}
//     功能描述: 基于 ENERGY GUI 框架的实现, 包含UI组件创建
// ==============================================================================

{{$Form := .}}

package {{$Form.PackageName}}

import (
	{{$Form.GoGetImports}}
)

type T{{$Form.Form.Name}} struct {
	lcl.TEngForm
	{{range $Form.Form.Children -}}
	{{.GoFieldName}} {{.GoIntfName}}
	{{end -}}
}

var {{$Form.Form.Name}} T{{$Form.Form.Name}}

// FormCreate 窗体创建接口实现. 自动调用
func (m *T{{$Form.Form.Name}}) FormCreate(sender lcl.IObject) {
	// 设置窗体属性
	{{$formComp := $Form.Form}}
	{{- range $propIndex, $prop := $formComp.Properties -}}
		{{$prop.GoPropertySet $formComp $Form}}
	{{end -}}
	// 初始化组件
	m.initComponents()
    // 调用用户创建窗体事件
	m.OnFormCreate(sender)
}

// initComponents 初始化组件
func (m *T{{$Form.Form.Name}}) initComponents() {
    // 组件初始化和设置属性
	{{range $compIndex, $comp := $Form.Form.Children -}}
		{{$comp.GoNewObject}}
	{{- range $propIndex, $prop := $comp.Properties -}}
		{{$prop.GoPropertySet $comp $Form}}
	{{end -}}
		{{$comp.GoSetObjectParent}}
	{{end -}}
}
`

// userCodeTemplate 用户代码模板
const userCodeTemplate = `// ==============================================================================
// 📚 {{.BaseInfo.UserFile}} 用户代码文件
// 📌 该文件不存在时自动创建
// ✏️ 可在此文件中添加事件处理和业务逻辑
//    生成时间: {{.BaseInfo.DateTime}}
// ==============================================================================

{{$Form := .}}

package {{$Form.PackageName}}

import (
	{{$Form.GoGetImports}}
	"github.com/energye/lcl/types"
)

// OnFormCreate 窗体初始化事件
func (m *T{{$Form.Form.Name}}) OnFormCreate(sender lcl.IObject) {
	// TODO 在此处添加窗体初始化代码
}

// OnCloseQuery 窗体关闭前询问事件
func (m *T{{$Form.Form.Name}}) OnCloseQuery(sender lcl.IObject, canClose *bool) {
	// TODO 在此处添加窗体关闭前询问代码
}

// OnClose 仅当 OnCloseQuery 中 CanClose 被设置为 True 后会触发
func (m *T{{$Form.Form.Name}}) OnClose(sender lcl.IObject, closeAction *types.TCloseAction) {
	// TODO 在此处添加窗体关闭代码
}

{{range $Form.Form.Children}}
// On{{.Name}}Click {{.Name}}点击事件
func (m *T{{$Form.Form.Name}}) On{{.Name}}Click(sender lcl.IObject) {
	// TODO 在此处添加点击事件处理代码
}
{{end}}
`

// app/run 文件代码模板
// app/run.go 不存在项目目录时创建
const runCodeTemplate = `// ==============================================================================
// 📚 应用启动入口文件
// 📌 该文件不存在时自动创建
// ✏️ 可在此文件中添加业务逻辑
// ==============================================================================

package main

import (
	"github.com/energye/lcl/lcl" 
	{{.WindowsSyso}}
)

func main() {
	lcl.Init(nil, nil)
	lcl.Application.Initialize()
	lcl.Application.SetMainFormOnTaskBar(true)
	lcl.Application.SetScaled(true)
	lcl.Application.NewForms({{.Forms}})
	lcl.Application.Run()
}
`
